Utilizando como referencia la tabla sobre actividad física y gasto calórico disponible en la página W3Schools.com, desarrolla un modelo de Machine Learning eficiente para la predicción, aplicando técnicas de análisis y selección de variables relevantes.
# Importar librerias
import pandas as pd
import plotly.io as pio
# Renderirzar graficos de plotly para verlos en el navegador web
pio.renderers.default = 'notebook'
# Leer datos descargados de W3School - Actividzd fisica y gasto calorico
df = pd.read_csv("../data/data_calorias.csv")
print(df)
Duration Pulse Maxpulse Calories 0 60 110 130 409.1 1 60 117 145 479.0 2 60 103 135 340.0 3 45 109 175 282.4 4 45 117 148 406.0 .. ... ... ... ... 164 60 105 140 290.8 165 60 110 145 300.0 166 60 115 145 310.2 167 75 120 150 320.4 168 75 125 150 330.4 [169 rows x 4 columns]
print("**! Estructura de la tabla !**")
print(df.info())
print("**! Estadisticas descriptivas !**")
print(df.describe())
**! Estructura de la tabla !**
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 169 entries, 0 to 168
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Duration 169 non-null int64
1 Pulse 169 non-null int64
2 Maxpulse 169 non-null int64
3 Calories 164 non-null float64
dtypes: float64(1), int64(3)
memory usage: 5.4 KB
None
**! Estadisticas descriptivas !**
Duration Pulse Maxpulse Calories
count 169.000000 169.000000 169.000000 164.000000
mean 63.846154 107.461538 134.047337 375.790244
std 42.299949 14.510259 16.450434 266.379919
min 15.000000 80.000000 100.000000 50.300000
25% 45.000000 100.000000 124.000000 250.925000
50% 60.000000 105.000000 131.000000 318.600000
75% 60.000000 111.000000 141.000000 387.600000
max 300.000000 159.000000 184.000000 1860.400000
Preguntas clave para explorar los datos y manejo de funcones en Pandas
# 1. ¿Cuántas sesiones de ejercicio se han registrado en total?
total_sesiones = len(df)
print(f"1. Total de sesiones de ejercicio registradas: {total_sesiones}")
# 2. ¿Cuál es la duración promedio de las sesiones de ejercicio?
duracion_promedio = df["Duration"].mean()
print(f"2. Duración promedio de las sesiones de ejercicio: {duracion_promedio:.2f} minutos")
# 3. ¿Qué tan variable es la quema de calorías entre las sesiones?
variabiidad_calorias = df["Calories"].std()
print(f"3. Variabilidad en la quema de calorías (desviación estándar): {variabiidad_calorias:.2f}")
# 4. ¿Cuál es la sesión de menor y mayor duración registrada?
duracion_min = df["Duration"].min()
duracion_max = df["Duration"].max()
print(f"4.1 Sesión de menor duración: {duracion_min} minutos")
print(f"4.2 Sesión de mayor duración: {duracion_max} minutos")
# 5. ¿Cuántas sesiones tienen valores faltantes en la quema de calorías?
calorias_vacias = df["Calories"].isna().sum()
print(f"5. Sesiones con valores faltantes en calorías: {calorias_vacias}")
1. Total de sesiones de ejercicio registradas: 169 2. Duración promedio de las sesiones de ejercicio: 63.85 minutos 3. Variabilidad en la quema de calorías (desviación estándar): 266.38 4.1 Sesión de menor duración: 15 minutos 4.2 Sesión de mayor duración: 300 minutos 5. Sesiones con valores faltantes en calorías: 5
La variable objetivo (y, en este caso Calories) contiene 5 valores nulos (NaN). Scikit-learn no puede procesar datos faltantes directamente, por lo que es necesario limpiar o manejar estos valores antes de entrenar el modelo.
# Verificar valores nulos
print(f"**! Varaibles con valores nulos: Dataframe original !**\n{df.isna().sum()}")
# Manejar valores nulos en la variable objetivo
df = df.dropna(subset=["Calories"]) # O imputar: df["Calories"].fillna(df["Calories"].mean(), inplace=True)
# Asegúrate de que no haya valores nulos
print(f"**! Varaibles con valores nulos: Dataframe depurado !**\n{df.isna().sum()}")
**! Varaibles con valores nulos: Dataframe original !** Duration 0 Pulse 0 Maxpulse 0 Calories 5 dtype: int64 **! Varaibles con valores nulos: Dataframe depurado !** Duration 0 Pulse 0 Maxpulse 0 Calories 0 dtype: int64
Nota: Es posible que algunos registros tengan los mismos valores en Duración, Pulsaciones, Máximo Pulso y Calorías, pero representan diferentes sesiones de ejercicio realizadas por la misma o diferentes personas, por lo tanto no necesariamente deben considerarse duplicados en el sentido de ser un error en los datos.
# Encontrar duplicados
df_duplicados = df[df.duplicated(keep=False)]
# Ordenar por todas las columnas para agrupar duplicados
df_duplicados = df_duplicados.sort_values(by=df.columns.tolist())
# Mostrar el resultado
print(df_duplicados)
# Exportar duplicados a un archivo Excel
# df_duplicados.to_excel("duplicados.xlsx", index=False)
# Remover todos los duplicados
# df.drop_duplicates(inplace = True)
# print(df)
# Tabala de correlación entre variables
corr_matrix = df.corr()
print(corr_matrix)
Duration Pulse Maxpulse Calories Duration 1.000000 -0.160661 0.005679 0.922717 Pulse -0.160661 1.000000 0.784631 0.025121 Maxpulse 0.005679 0.784631 1.000000 0.203813 Calories 0.922717 0.025121 0.203813 1.000000
import plotly.express as px
# Crear el heatmap de correlación
fig = px.imshow(corr_matrix, text_auto=True, color_continuous_scale='Blues', title="Heatmap de Correlación")
fig.show()
import plotly.express as px
# Crear el gráfico de dispersión múltiple
fig = px.scatter_matrix(df,
dimensions=["Duration", "Pulse", "Maxpulse", "Calories"],color="Calories",
title="Matriz de Dispersión entre Variables")
fig.update_traces(diagonal_visible=False) # Ocultar los gráficos de la diagonal
fig.show()
Correlación entre Calories y las demás variables:
Comenzaremos con un Modelo de Regresión Lineal Simple para evaluar la relación entre una de las variables predictoras, como la Duración del ejercicio, y las Calorías quemadas. Este modelo nos permitirá entender de manera inicial cómo una sola variable puede predecir la variable objetivo. Posteriormente, avanzaremos a un Modelo de Regresión Lineal Múltiple, en el cual incorporaremos variables predictoras como Duración y Máximo Pulso. Este enfoque nos ayudará a seleccionar el modelo más adecuado y preciso para la predicción.
Modelo de Regresion Lineal Simple
# Importar librerias
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
# Usamos solo Duration como variable predictora
X_simple = df[["Duration"]]
y = df["Calories"]
# Dividir los datos en conjuntos de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X_simple, y, test_size=0.2, random_state=42)
# Crear y entrenar el modelo de regresión simple
model = LinearRegression()
model.fit(X_train, y_train)
# Realizar predicciones
y_pred = model.predict(X_test)
# Evaluar el modelo
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("Coeficiente del modelo:", model.coef_)
print("Intercepto del modelo:", model.intercept_)
print("Error cuadrático medio (MSE):", mse)
print("R² del modelo:", r2)
# Ejemplo de predicción
new_data = pd.DataFrame({"Duration": [70]})
calories_pred = model.predict(new_data)
print("Calorías predichas:", calories_pred)
Coeficiente del modelo: [5.75538402] Intercepto del modelo: 5.229634541828489 Error cuadrático medio (MSE): 8245.553232781873 R² del modelo: 0.7471444773251994 Calorías predichas: [408.10651579]
Interpretación del modelo
# Importar librerias
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# Seleccionar las variables predictoras y la variable objetivo
X = df[["Duration", "Maxpulse"]] # Variables predictoras
y = df["Calories"] # Variable objetivo
# Dividir los datos en conjuntos de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Crear y entrenar el modelo de regresión lineal
model = LinearRegression()
model.fit(X_train, y_train)
# Realizar predicciones
y_pred = model.predict(X_test)
# Evaluar el modelo
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("Coeficientes del modelo:", model.coef_)
print("Intercepto del modelo:", model.intercept_)
print("Error cuadrático medio (MSE):", mse)
print("R² del modelo:", r2)
# Ejemplo de predicción
new_data = pd.DataFrame({"Duration": [70], "Maxpulse": [140]})
calories_pred = model.predict(new_data)
print("Calorías predichas:", calories_pred)
Coeficientes del modelo: [5.71057461 2.99381171] Intercepto del modelo: -393.44345667081967 Error cuadrático medio (MSE): 3558.03410518467 R² del modelo: 0.8908904535617549 Calorías predichas: [425.43040575]
Interpretación del modelo
Aplicando el modelo de regresion multiple:
El modelo tiene dos variables predictoras: Duration y Maxpulse.
La fórmula para predecir Calories sería:
Usando los valores obtenidos del modelo:
Entonces, la fórmula para predecir las Calories es:
Sustituyendo los valores:
Entonces, la predicción de Calories sería:
Exportar a HTML
jupyter nbconvert --to html notebook/regresion_lineal.ipynb